+use crate::{RepoCheckoutMode, RepoCheckoutOverwriteMode, RepoDevInoCache, SePolicy};
use glib::translate::{Stash, ToGlib, ToGlibPtr};
use glib_sys::gpointer;
use libc::c_char;
use ostree_sys::OstreeRepoCheckoutAtOptions;
-use std::path::{Path, PathBuf};
-use {Repo, RepoCheckoutFilterResult};
-use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
-use {RepoDevInoCache, SePolicy};
+use std::path::PathBuf;
mod repo_checkout_filter;
-pub use self::repo_checkout_filter::RepoCheckoutFilter;
+pub use self::repo_checkout_filter::{repo_checkout_filter, RepoCheckoutFilter};
pub struct RepoCheckoutAtOptions {
pub mode: RepoCheckoutMode,
#[cfg(test)]
mod tests {
use super::*;
+ use crate::RepoCheckoutFilterResult;
use gio::{File, NONE_CANCELLABLE};
use glib_sys::{gpointer, GFALSE, GTRUE};
use ostree_sys::{
force_copy_zerosized: true,
subpath: Some("sub/path".into()),
devino_to_csum_cache: Some(RepoDevInoCache::new()),
- filter: Some(Box::new(|_repo, _path, _stat| {
- RepoCheckoutFilterResult::Skip
- })),
+ filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Skip),
sepolicy: Some(SePolicy::new(&File::new_for_path("a/b"), NONE_CANCELLABLE).unwrap()),
sepolicy_prefix: Some("prefix".into()),
};
pub type RepoCheckoutFilter = Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
+pub fn repo_checkout_filter<F>(closure: F) -> Option<RepoCheckoutFilter>
+where
+ F: 'static,
+ F: Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult,
+{
+ Some(Box::new(closure))
+}
+
unsafe extern "C" fn filter_trampoline(
repo: *mut OstreeRepo,
path: *const c_char,
force_copy: true,
force_copy_zerosized: true,
devino_to_csum_cache: Some(RepoDevInoCache::new()),
- filter: Some(Box::new(|_repo, _path, _stat| {
- RepoCheckoutFilterResult::Allow
- })),
+ filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Allow),
..Default::default()
}),
dirfd.as_raw_fd(),
.repo
.checkout_at(
Some(&RepoCheckoutAtOptions {
- filter: Some(Box::new(|_repo, path, _stat| {
+ filter: repo_checkout_filter(|_repo, path, _stat| {
if let Some("testfile") = path.file_name().map(|s| s.to_str().unwrap()) {
RepoCheckoutFilterResult::Skip
} else {
RepoCheckoutFilterResult::Allow
}
- })),
+ }),
..Default::default()
}),
dirfd.as_raw_fd(),